package org.zjh.view.game;

import org.zjh.constant.ImageConstant;
import org.zjh.controller.GameController;
import org.zjh.controller.listener.GameOverOkJbtList;
import org.zjh.model.Player;
import org.zjh.model.RealPlayer;
import org.zjh.view.ui.GameUi;

import javax.swing.*;
import java.awt.*;

/**
 * @description: 游戏结算面板，显示游戏结束后的得分情况
 * @author 郑佳豪
 * @date 2024/10/24 12:56
 * @version 1.0
 */
public class GameOverPanel extends JPanel {
    // 当前出完手牌的玩家
    private Player curDiscardPlayer;

    public GameOverPanel(Player curDiscardPlayer) {
        setLayout(null);
        this.curDiscardPlayer = curDiscardPlayer;
        // 更新分数信息
        updateScores();
        JButton jButton = new JButton("确定");
        // 设置按钮位置和大小
        jButton.setBounds(350, 400, 75, 40);
        add(jButton);
        // 为按钮添加点击事件监听
        jButton.addMouseListener(new GameOverOkJbtList());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(ImageConstant.INTRODUCE_IMAGE.getImage(), 0, 0, 800, 500, null);
        // 绘制游戏结算信息
        paintInfo(g);
    }

    /**
     * 更新玩家分数
     */
    private void updateScores() {
        GameController gameController = GameController.getInstance();
        GamePanel gamePanel = GameUi.gameFrame.getGamePanel();

        // 获取倍数
        String multipleStr = gamePanel.getMultipleJLabel().getText().substring(3);
        int multiple = Integer.parseInt(multipleStr);
         // 判断当前出完手牌的玩家是否为真实玩家
        boolean realPlayerIsEmpty = curDiscardPlayer instanceof RealPlayer;
        // 判断地主是否为真实玩家
        boolean landOwnerIsRealPlayer = gameController.getLandOwnerPlayer() == gameController.getPlayer();

        // 实际玩家手牌为空
        if (realPlayerIsEmpty) {
            // 真实玩家手牌为空
            if (landOwnerIsRealPlayer) {
                // 实际玩家是地主
                // 实际玩家得分
                gameController.getPlayer().setScore(gameController.getPlayer().getScore() + multiple * 2);
                //电脑A扣分
                gameController.getComputerA().setScore(gameController.getComputerA().getScore() - multiple);
                //电脑B扣分
                gameController.getComputerB().setScore(gameController.getComputerB().getScore() - multiple);
            } else {
                // 实际玩家是农民
                //实际玩家加分
                gameController.getPlayer().setScore(gameController.getPlayer().getScore() + multiple);
                //判断电脑A 是不是地主
                if (gameController.getLandOwnerPlayer() == gameController.getComputerA()) {
                    //是的话 电脑A 扣分
                    gameController.getComputerA().setScore(gameController.getComputerA().getScore() - multiple * 2);
                    //电脑B 加分
                    gameController.getComputerB().setScore(gameController.getComputerB().getScore() + multiple);
                } else {
                    //不是 那么就是 电脑B 为地主
                    //电脑B 扣分
                    gameController.getComputerB().setScore(gameController.getComputerB().getScore() - multiple * 2);
                    //电脑A 加分
                    gameController.getComputerA().setScore(gameController.getComputerA().getScore() + multiple);
                }
            }
        } else {
            // 实际玩家手牌不为空
            if (landOwnerIsRealPlayer) {
                // 实际玩家是地主
                //实际玩家扣分
                gameController.getPlayer().setScore(gameController.getPlayer().getScore() - multiple * 2);
                //电脑A 加分
                gameController.getComputerA().setScore(gameController.getComputerA().getScore() + multiple);
                //电脑B 加分
                gameController.getComputerB().setScore(gameController.getComputerB().getScore() + multiple);
            } else {
                // 实际玩家不是地主
                if (gameController.getLandOwnerPlayer() == gameController.getComputerA()) {
                    // 电脑玩家A是地主
                    if (curDiscardPlayer == gameController.getComputerA()) {
                        // 出完手牌的玩家是A
                        // A得分
                        gameController.getComputerA().setScore(gameController.getComputerA().getScore() + multiple * 2);
                        // 另一个农民扣分
                        gameController.getComputerB().setScore(gameController.getComputerB().getScore() - multiple);
                        // 真实玩家扣分
                        gameController.getPlayer().setScore(gameController.getPlayer().getScore() - multiple);
                    } else {
                        // 如果不是A
                        // A扣分
                        gameController.getComputerA().setScore(gameController.getComputerA().getScore() - multiple * 2);
                        // 另一个农民得分
                        gameController.getComputerB().setScore(gameController.getComputerB().getScore() + multiple);
                        // 真实玩家得分
                        gameController.getPlayer().setScore(gameController.getPlayer().getScore() + multiple);
                    }
                } else if (gameController.getLandOwnerPlayer() == gameController.getComputerB()) {
                    // 电脑玩家B是地主
                    if (curDiscardPlayer == gameController.getComputerB()) {
                        // 出完手牌的玩家是B
                        // B得分
                        gameController.getComputerB().setScore(gameController.getComputerB().getScore() + multiple * 2);
                        // 另一个农民扣分
                        gameController.getComputerA().setScore(gameController.getComputerA().getScore() - multiple);
                        // 真实玩家扣分
                        gameController.getPlayer().setScore(gameController.getPlayer().getScore() - multiple);
                    } else {
                        // 如果不是B
                        // A扣分
                        gameController.getComputerA().setScore(gameController.getComputerA().getScore() - multiple * 2);
                        // 另一个农民得分
                        gameController.getComputerB().setScore(gameController.getComputerB().getScore() + multiple);
                        // 真实玩家得分
                        gameController.getPlayer().setScore(gameController.getPlayer().getScore() + multiple);
                    }
                }
            }
        }
    }

    /**
     * 绘制游戏结算信息
     */
    private void paintInfo(Graphics g) {
        GamePanel gamePanel = GameUi.gameFrame.getGamePanel();
        GameController gameController = GameController.getInstance();

        // 获取倍数信息
        String multipleStr = gamePanel.getMultipleJLabel().getText().substring(3);
        int multiple = Integer.parseInt(multipleStr);

        // 设置标题字体和颜色
        drawText(g, "结算面板", new Font("黑体", Font.PLAIN, 40), Color.BLACK, 325, 50);

        // 显示分数等信息
        drawText(g, "基础分：【" + multiple + "】分", new Font("黑体", Font.PLAIN, 25), Color.BLACK, 50, 160);
        drawText(g, "炸弹：2倍 × 【" + gamePanel.getBoomNum() + "】", new Font("黑体", Font.PLAIN, 25), Color.BLACK, 50, 200);
        drawText(g, "王炸：2倍 × 【" + gamePanel.getRocketNum() + "】", new Font("黑体", Font.PLAIN, 25), Color.BLACK, 50, 240);
        drawText(g, "春天：2倍 × 【0】", new Font("黑体", Font.PLAIN, 25), Color.BLACK, 50, 280);
        drawText(g, "总倍数：" + "【" + multipleStr + "】", new Font("黑体", Font.PLAIN, 25), Color.BLACK, 300, 320);

        // 获取玩家昵称
        String realPlayerNickname = gameController.getPlayer().getNickname();
        String PCAPlayerNickname = gameController.getComputerA().getNickname();
        String PCBPlayerNickname = gameController.getComputerB().getNickname();

        // 判定胜负
        boolean realPlayerPokerIsEmpty = curDiscardPlayer instanceof RealPlayer;

        if (realPlayerPokerIsEmpty) {
            // 实际玩家手牌为空
            drawText(g, "你赢了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
            if (gameController.getPlayer() == gameController.getLandOwnerPlayer()) {
                //真实玩家是地主
                drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, true, false, false,true,false,false);
            } else {
                //真实玩家不是地主
                if (gameController.getLandOwnerPlayer() == gameController.getComputerA()) {
                    //电脑A 是地主
                    drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, true, false, true,false,true,false);
                } else {
                    //电脑B 是地主
                    drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, true, true, false,false,false,true);
                }
            }
        } else {
            // 实际玩家手牌未空
            //判断 实际玩家是否是地主
            if (gameController.getPlayer() == gameController.getLandOwnerPlayer()) {
                //是的话 实际玩家 扣分 电脑A 电脑B 加分
                drawText(g, "你输了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
                drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, false, true, true,true,false,false);
            } else {
                //不是的话 判断 电脑A 是否是地主
                if (gameController.getLandOwnerPlayer() == gameController.getComputerA()) {
                    //是的话 在判断 电脑A的手牌是否为空
                    if (curDiscardPlayer == gameController.getComputerA()){
                        //是的话 电脑A加分 实际玩家 电脑B 扣分
                        drawText(g, "你输了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
                        drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, false, true, false,false,true,false);
                    }else{
                        //不是的话 实际玩家加分 电脑A 扣分 电脑B 加分
                        drawText(g, "你赢了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
                        drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, true, false, true,false,true,false);
                    }
                } else {
                    //电脑B是地主
                    //判断 电脑B的手牌是否为空
                    if (curDiscardPlayer == gameController.getComputerB()){
                        //是的话 电脑B加分 实际玩家 电脑A 扣分
                        drawText(g, "你输了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
                        drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, false, false, true,false,false,true);
                    }else{
                        //不是的话 实际玩家加分 电脑B 扣分 电脑A 加分
                        drawText(g, "你赢了！", new Font("黑体", Font.PLAIN, 30), Color.BLACK, 350, 100);
                        drawPlayerScores(g, realPlayerNickname, PCAPlayerNickname, PCBPlayerNickname, multiple, true, true, false,false,false,true);
                    }
                }
            }
        }
    }

    /**
     * 绘制结算信息
     * @param g 画笔
     * @param realPlayerNickname 实际玩家昵称
     * @param PCAPlayerNickname 电脑A 昵称
     * @param PCBPlayerNickname 电脑B 昵称
     * @param multiple 倍数
     * @param realWin 实际玩家是否胜利
     * @param isA 电脑A 是否胜利
     * @param isB 电脑B 是否胜利
     */
    private void drawPlayerScores(Graphics g, String realPlayerNickname, String PCAPlayerNickname, String PCBPlayerNickname,
                                  int multiple, boolean realWin, boolean isA, boolean isB,boolean realLandOwner,boolean pcALandOwner,boolean pcBLandOwner) {

        // 真实玩家得分
        int realPlayerScore = calculateScore(multiple, realWin, realLandOwner);
        drawText(g, realPlayerNickname + " " + (realWin ? "胜利  +" : "失败  ") + realPlayerScore + "分",
                new Font("黑体", Font.PLAIN, 25), Color.BLACK, 450, 200);

        // 电脑玩家A得分
        int scoreA = calculateScore(multiple, isA, pcALandOwner);
        drawText(g, PCAPlayerNickname + " " + (isA ? "胜利  +" : "失败  ") + scoreA + "分",
                new Font("黑体", Font.PLAIN, 25), Color.BLACK, 450, 240);

        // 电脑玩家B得分
        int scoreB = calculateScore(multiple, isB, pcBLandOwner);
        drawText(g, PCBPlayerNickname + " " + (isB ? "胜利  +" : "失败  ") + scoreB + "分",
                new Font("黑体", Font.PLAIN, 25), Color.BLACK, 450, 280);
    }

    /**
     * 根据胜负情况计算得分
     */
    private int calculateScore(int multiple, boolean isWin, boolean isLandOwner) {
        if (isWin) {
            return isLandOwner ? multiple * 2 : multiple;
        } else {
            return isLandOwner ? -multiple * 2 : -multiple;
        }
    }

    /**
     * 绘制文本
     * @param g 画笔
     * @param text 文本内容
     * @param font 字体
     * @param color 颜色
     * @param x x坐标
     * @param y y坐标
     */
    private void drawText(Graphics g, String text, Font font, Color color, int x, int y) {
        g.setFont(font);
        g.setColor(color);
        g.drawString(text, x, y);
    }
}
